/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.mbean;

import com.brain.comp.dto.ComprobanteCompraDto;
import com.brain.comp.dto.ComprobanteCompraManager;
import com.brain.comp.dto.PedidoCompraDto;
import com.brain.comp.dto.PlanPagoDto;
import com.brain.comp.manager.PlanPagoManager;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.dto.TarifaDto;
import com.brain.conf.dto.UnidadMedidaDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.conf.manager.CondicionPagoManager;
import com.brain.conf.manager.MonedaManager;
import com.brain.conf.manager.TarifaManager;
import com.brain.conf.manager.UnidadMedidaManager;
import com.brain.core.common.ExportarExcelCompras;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("comprobanteCompraMBean")
@Scope("session")
public class ComprobanteCompraMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(ComprobanteCompraMBean.class);
    @Resource
    private ComprobanteCompraManager manager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private SistemaControlCompMBean sistemaControlCompMBean;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private PlanPagoManager planPagoManager;
    @Resource
    private UnidadMedidaManager umManager;
    @Resource
    private TarifaManager tarifaManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Resource
    private MonedaManager monedaManager;
    @Autowired
    private SessionMBean sessionMBean;
    private List<ComprobanteCompraDto> lista;
    private ComprobanteCompraDto dto;
    private ComprobanteCompraDto dtoFiltro;
    private String keyEntidad = "key.entidad.comprobante.compra";
    private SelectItem[] siEstadosFiltro;
    private SelectItem[] siDocTransaccion;
    private Date fechaActual;
    private List<UnidadMedidaDto> listaUnidadMedida;
    private List<TarifaDto> listaTarifas;
    private List<MonedaDto> listaMonedas;
    private PedidoCompraDto pedidoCompraDto;
    private List<AlmacenDto> listaAlmacenes;
    private List<ParametroDto> listaFormaPago;
    private List<CondicionPagoDto> listaCondicionPago;
    private PlanPagoDto planPagoDto;
    private boolean accesoAnulado;
    private boolean accesoConfirmado;
    private boolean accesoGuardar;
    private ComprobanteCompraDto[] selectedCCs;
    private ExportarExcelCompras.ComprobanteCompra ccExcel;
    private String tipoXls;
    private Boolean checkExcel;

    public ComprobanteCompraMBean() {
        this.dtoFiltro = new ComprobanteCompraDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.dtoFiltro = new ComprobanteCompraDto();
        this.dtoFiltro.setDescProveedor("");
        this.dtoFiltro.setEstado(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_TODOS);
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.ccExcel = new ExportarExcelCompras.ComprobanteCompra(true);
        this.selectedCCs = null;
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        this.planPagoDto = this.planPagoManager.inicializar();
        gestionAcceso();
        return manager.getUrl();
    }

    public void nuevoPlanPago() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.planPagoDto = this.planPagoManager.inicializar();
        this.planPagoDto.setDocumentoCompraDto(null);
        this.planPagoDto.setComprobanteCompraDto(dto);
        this.planPagoDto.setMonedaDto(dto.getMonedaDto());
        //Obtenemos el Item del detalle
        if (!dto.getListaPlanPagos().isEmpty()) {
            planPagoDto.setOrden(dto.getListaPlanPagos().size() + 1);
        } else {
            planPagoDto.setOrden(1);
        }
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.planPagoDto = this.planPagoManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
            this.dto.setComentario("");
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }

    public void editarPlanPago() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        try {
            this.planPagoDto = planPagoManager.obtenerPorId(this.planPagoDto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.planPagoDto = this.planPagoManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }

    public void verPlanPago() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        try {
            this.planPagoDto = planPagoManager.obtenerPorId(this.planPagoDto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void buscar() {
        try {
            List<ComprobanteCompraDto> l = new ArrayList<ComprobanteCompraDto>();            
            this.lista = this.manager.obtener(this.dtoFiltro);
            if (!this.lista.isEmpty()) {
                for (ComprobanteCompraDto x: this.lista) {
                    x.setUltimaModificacion(this.manager.obtenerCadenaUltimaModificacionLista(x));
                    l.add(x);
                }
                this.lista = l;
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }

    public void guardarPlanPago() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (this.planPagoManager.guardar(this.planPagoDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
            } else {
                resultado = false;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void eliminarPlanPago() {
        try {
            this.planPagoManager.eliminar(this.planPagoDto);
            this.dto = this.manager.obtenerPorId(this.dto.getId());
            this.manager.reordenarPlanPagos(this.dto.getListaPlanPagos());
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public void anular() {
        dto.setFechaAnulacion(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioAnulacionDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO);
        guardar();
    }

    public void confirmar() {
        dto.setFechaConfirmacion(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioConfirmacionDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO);
        guardar();
    }

    public String cargarPopupConfirmar() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlCompMBean.cargarEncargadosParaPopup(ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_COMPROBANTE, ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_CONFIRMADO, dto.getId());
            if (sistemaControlCompMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlCompMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                confirmar();
                return manager.getUrl() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }

    public String cargarPopupAnular() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlCompMBean.cargarEncargadosParaPopup(ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_COMPROBANTE, ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ANULADO, dto.getId());
            if (sistemaControlCompMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlCompMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                anular();
                return manager.getUrl() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }

    public void gestionAcceso() {
        this.accesoAnulado = false;
        this.accesoConfirmado = false;
        this.accesoGuardar = true;
        if (dto.getId() != null) {
            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ELABORACION)) {//elaboracion
                this.accesoAnulado = true;
                this.accesoConfirmado = true;
                this.accesoGuardar = true;
            } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)
                    || dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO)) {
                this.accesoAnulado = false;
                this.accesoConfirmado = false;
                this.accesoGuardar = false;
            }

            //Si la accion es = VER
            if (sessionMBean.getAccion() == applicationMBean.getVer()) {
                this.accesoAnulado = false;
                this.accesoConfirmado = false;
                this.accesoGuardar = false;
            }
        } else {
            this.accesoConfirmado = true;
        }
    }

    public void handleProveedorChange() {
        BigDecimal descuento = manager.obtenerDescuentoPorProveedor(this.dto.getProveedorDto());
        this.dto.setDescuento(descuento);
        this.manager.recalcularMontos(dto);
    }

    public void handleMonedaChange() {
        try {
            if (this.dto.getId() != null) {
                this.dto = manager.recalculardatosPorMoneda(this.dto);
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }

    public void recalcularMontos() {
        this.manager.recalcularMontos(dto);
    }

    public void verificarMontoLiquidarPago() {
        this.manager.verificarMontoLiquidarPago(this.dto, this.planPagoDto);
    }

    public String retroceder() {
        buscar();
        return this.manager.getUrlLista();
    }

    public void imprimirDto() {
        this.manager.imprimirDto(dto);
    }

    private void generarExcelSeleccionadosComprobanteCompra() {
        this.manager.generarExcelSeleccionados(ccExcel, selectedCCs);
    }

    private void generarExcelPorTablaComprobanteCompra() {
        this.manager.generarExcelPorTabla(ccExcel, lista);
    }

    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaComprobanteCompra();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosComprobanteCompra();
        }
    }

    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.comprobante.compra"));
            }
        } else if (tipo.equals("S")) {
            if (selectedCCs.length <= 0) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.comprobante.compra"));
            }
        }
        if (resultado) {
            this.ccExcel = new ExportarExcelCompras.ComprobanteCompra(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void onChangeChekExcel() {
        this.ccExcel = manager.onChangeChekExcel(checkExcel);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ComprobanteCompraMBean.logger = logger;
    }

    public ComprobanteCompraManager getManager() {
        return manager;
    }

    public void setManager(ComprobanteCompraManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<ComprobanteCompraDto> getLista() {
        return lista;
    }

    public void setLista(List<ComprobanteCompraDto> lista) {
        this.lista = lista;
    }

    public ComprobanteCompraDto getDto() {
        return dto;
    }

    public void setDto(ComprobanteCompraDto dto) {
        this.dto = dto;
    }

    public ComprobanteCompraDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(ComprobanteCompraDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public SelectItem[] getSiEstadosFiltro() {
        siEstadosFiltro = manager.siEstadosComprobanteCompraTodos();
        return siEstadosFiltro;
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public Date getFechaActual() {
        return UtilCore.Fecha.obtenerFechaActualDate();
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public List<TarifaDto> getListaTarifas() throws DAOException {
        listaTarifas = tarifaManager.obtenerActivosPorOrganizacion();
        return listaTarifas;
    }

    public void setListaTarifas(List<TarifaDto> listaTarifas) {
        this.listaTarifas = listaTarifas;
    }

    public List<UnidadMedidaDto> getListaUnidadMedida() throws DAOException {
        listaUnidadMedida = umManager.obtenerTodosActivos();
        return listaUnidadMedida;
    }

    public void setListaUnidadMedida(List<UnidadMedidaDto> listaUnidadMedida) {
        this.listaUnidadMedida = listaUnidadMedida;
    }

    public boolean isAccesoAnulado() {
        return accesoAnulado;
    }

    public void setAccesoAnulado(boolean accesoAnulado) {
        this.accesoAnulado = accesoAnulado;
    }

    public boolean isAccesoConfirmado() {
        return accesoConfirmado;
    }

    public void setAccesoConfirmado(boolean accesoConfirmado) {
        this.accesoConfirmado = accesoConfirmado;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }

    public List<MonedaDto> getListaMonedas() throws DAOException {
        listaMonedas = monedaManager.obtenerMonedasActivasPorEmpresa();
        return listaMonedas;
    }

    public void setListaMonedas(List<MonedaDto> listaMonedas) {
        this.listaMonedas = listaMonedas;
    }

    public PedidoCompraDto getPedidoCompraDto() {
        return pedidoCompraDto;
    }

    public void setPedidoCompraDto(PedidoCompraDto pedidoCompraDto) {
        this.pedidoCompraDto = pedidoCompraDto;
    }

    public SelectItem[] getSiDocTransaccion() {
        return manager.siDocTransaccion();
    }

    public void setSiDocTransaccion(SelectItem[] siDocTransaccion) {
        this.siDocTransaccion = siDocTransaccion;
    }

    public List<AlmacenDto> getListaAlmacenes() throws DAOException {
        AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
        listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
        return listaAlmacenes;
    }

    public void setListaAlmacenes(List<AlmacenDto> listaAlmacenes) {
        this.listaAlmacenes = listaAlmacenes;
    }

    public List<ParametroDto> getListaFormaPago() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesComp.CatalogoParametro.FORMA_PAGO);
    }

    public void setListaFormaPago(List<ParametroDto> listaFormaPago) {
        this.listaFormaPago = listaFormaPago;
    }

    public List<CondicionPagoDto> getListaCondicionPago() throws DAOException {
        CondicionPagoManager condicionPagoManager = (CondicionPagoManager) WebServletContextListener.getApplicationContext().getBean("condicionPagoManager");
        listaCondicionPago = condicionPagoManager.obtenerActivosPorEmpresa();
        return listaCondicionPago;
    }

    public void setListaCondicionPago(List<CondicionPagoDto> listaCondicionPago) {
        this.listaCondicionPago = listaCondicionPago;
    }

    public PlanPagoDto getPlanPagoDto() {
        return planPagoDto;
    }

    public void setPlanPagoDto(PlanPagoDto planPagoDto) {
        this.planPagoDto = planPagoDto;
    }

    public ComprobanteCompraDto[] getSelectedCCs() {
        return selectedCCs;
    }

    public void setSelectedCCs(ComprobanteCompraDto[] selectedCCs) {
        this.selectedCCs = selectedCCs;
    }

    public ExportarExcelCompras.ComprobanteCompra getCcExcel() {
        return ccExcel;
    }

    public void setCcExcel(ExportarExcelCompras.ComprobanteCompra ccExcel) {
        this.ccExcel = ccExcel;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }
}
